package com.tarena.lbs.user.service.impl;

import com.alibaba.nacos.common.utils.CollectionUtils;
import com.github.pagehelper.PageInfo;
import com.tarena.lbs.base.protocol.pager.PageResult;
import com.tarena.lbs.common.enums.Roles;
import com.tarena.lbs.common.principle.UserPrinciple;
import com.tarena.lbs.common.utils.AuthenticationContextUtils;
import com.tarena.lbs.user.dao.repository.UserGroupRepository;
import com.tarena.lbs.user.dao.repository.UserTagsRepository;
import com.tarena.lbs.user.pojo.param.UserGroupParam;
import com.tarena.lbs.user.pojo.po.UserGroupPO;
import com.tarena.lbs.user.pojo.po.UserTagsPO;
import com.tarena.lbs.user.pojo.query.UserGroupQuery;
import com.tarena.lbs.user.pojo.vo.AdminVO;
import com.tarena.lbs.user.pojo.vo.UserGroupVO;
import com.tarena.lbs.user.service.UserGroupService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

@Slf4j
@Service
public class UserGroupServiceImpl implements UserGroupService {
    @Autowired
    private UserGroupRepository userGroupRepository;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserTagsRepository userTagsRepository;

    @Override
    public void saveUserGroup(UserGroupParam param) {
        log.debug("保存人群数据业务处理,入参:{}",param);
        //1 获取登录信息 token
        UserPrinciple userPrinciple = AuthenticationContextUtils.get();
        log.info("userPrinciple:{}", userPrinciple);
        //2 解析token 获取 用户信息 id
        Integer userId = userPrinciple.getId();
        //3 判断用户的权限
        if (userPrinciple.getRole().equals(Roles.SHOP)){
            log.info("用户权限为商家");
            UserGroupPO userGroupPO = new UserGroupPO();
            BeanUtils.copyProperties(param,userGroupPO);
            userGroupPO.setBusinessId(userId);
            userGroupPO.setCreateAt(new Date());
            userGroupRepository.saveUserGroup(userGroupPO);
            log.info("保存人群数据业务处理成功");
            // 扩展写入Redis
            Integer userGroupId = userGroupPO.getId(); // 确保ID已生成（如自增ID）
            // 2. 保存到Redis（关键！避免后续查询走DB）
            saveUserGroupToRedis(userGroupId, userGroupPO);
        }
    }

    /**
     * 将用户组数据写入Redis
     * @param userGroupId 用户组ID
     * @param userGroupPO 用户组对象
     */
    private void saveUserGroupToRedis(Integer userGroupId, UserGroupPO userGroupPO) {
        if (userGroupId == null || userGroupPO == null) {
            log.warn("无效参数，跳过缓存写入: userGroupId={}, userGroupPO={}", userGroupId, userGroupPO);
            return;
        }
        String key = "user_group:" + userGroupId;

        // 设置缓存过期时间（30分钟，避免长期不更新）
        try {
            redisTemplate.opsForValue().set(
                    key,
                    userGroupPO,
                    30,
                    TimeUnit.MINUTES
            );
            log.debug("用户组数据已写入Redis, key: {}", key);
        } catch (Exception e) {
            log.error("缓存用户组数据到Redis失败, key: {}", key, e);
        }
    }

    @Override
    public PageResult<UserGroupVO> userGroupList(UserGroupQuery query) {
        // 创建一个新的分页结果对象，用于存储最终的分页查询结果
        PageResult<UserGroupVO> voPage = new PageResult<>();
        //total objects pageNo pageSize totalPage
        // 调用 adminRepository 的 gePages 方法进行分页查询，获取包含管理员持久化对象的分页信息
        PageInfo<UserGroupPO> pageInfo = userGroupRepository.userGroupList(query);
        //pageNo pageSize total
        // 将分页信息中的页码设置到分页结果对象中
        voPage.setPageNo(pageInfo.getPageNum());
        // 将分页信息中的每页数量设置到分页结果对象中
        voPage.setPageSize(pageInfo.getPageSize());
        // 将分页信息中的总记录数设置到分页结果对象中
        voPage.setTotal(pageInfo.getTotal());
        // 声明一个存储管理员视图对象的列表
        List<UserGroupVO> vos = null;
        // 从分页信息中获取管理员持久化对象列表
        List<UserGroupPO> pos = pageInfo.getList();
        // 判断持久化对象列表是否不为空
        if (CollectionUtils.isNotEmpty(pos)){
            vos=pos.stream().map(po->{
                UserGroupVO vo = new UserGroupVO();
                BeanUtils.copyProperties(po,vo);
                return vo;
            }).collect(Collectors.toList());
        }
        voPage.setObjects(vos);
        return voPage;
    }

    @Override
    public UserGroupVO detail(Long id) {
        UserGroupPO po = userGroupRepository.getUserGroupById(id);
        UserGroupVO vo = new UserGroupVO();
        BeanUtils.copyProperties(po,vo);
        return vo;
    }

    /**
     * 根据用户ID和商家ID获取用户组IDs
     * @param userId 用户ID
     * @param businessId 商家ID
     * @return 用户组ID列表
     */
    @Override
    public List<Integer> getUserGroupIdsByUserIdAndBusinessId(Integer userId, Integer businessId) {
        // 查询用户的所有标签
        List<UserTagsPO> userTags = userTagsRepository.getUserTagsByUserId(userId);

        // 如果用户没有任何标签，直接返回空列表
        if (userTags == null || userTags.isEmpty()) {
            return new ArrayList<>();
        }

        // 提取标签ID列表
        List<Integer> tagIds = new ArrayList<>();
        for (UserTagsPO userTag : userTags) {
            // 确保标签ID不为null
            if (userTag.getTagId() != null) {
                tagIds.add(userTag.getTagId());
            }
        }

        // 如果没有有效的标签ID，返回空列表
        if (tagIds.isEmpty()) {
            return new ArrayList<>();
        }

        // 根据标签ID列表和商家ID查找匹配的用户组ID
        return userGroupRepository.findUserGroupIdsByTagIdsAndBizId(tagIds, businessId);
    }
}
